# -*- coding: utf-8 -*-
# @Time    : 2024/7/2 18:08
# @Author  : yujiahao
# @File    : 38_thread_pool_executor.py
# @description:线程池
"""
线程池简介:
-----------
线程池是一种用于并发执行多个任务的工具。它允许你使用有限数量的线程来执行大量的任务，从而有效地管理资源和提高性能。
Python 标准库中提供了 `concurrent.futures.ThreadPoolExecutor` 类来实现线程池。

使用方法:
-----------
1. 创建线程池:
    使用 `ThreadPoolExecutor` 创建一个线程池。
    例如: executor = ThreadPoolExecutor(max_workers=3)

2. 提交任务:
    将任务提交给线程池执行。
    例如: future = executor.submit(task, arg)

3. 获取结果:
    获取任务的执行结果。
    例如: result = future.result()

注意事项:
-----------
1. 线程安全:
    在多线程环境中操作共享资源时，需要注意线程安全问题。

2. GIL（Global Interpreter Lock）:
    Python 的 GIL 限制了多线程的并行执行，但对于 I/O 密集型任务，线程池仍然可以显著提高性能。

3. 任务异常处理:
    需要处理任务执行过程中的异常，避免程序崩溃。

使用场景:
-----------
1. I/O 密集型任务:
    如网络请求、文件读写等操作，可以通过线程池并发执行，提高效率。

2. 大量独立任务:
    如果有大量独立的任务需要并发执行，可以使用线程池来管理这些任务。

3. 资源受限环境:
    在资源受限的环境中，通过线程池限制线程数量，避免资源耗尽。

示例代码:
-----------
"""
from concurrent.futures import ThreadPoolExecutor, as_completed
import time


def task(n):
    print(f'Task {n} started')
    time.sleep(2)
    print(f'Task {n} completed')
    return n


def main():
    start = time.time()

    # 创建一个包含 3 个线程的线程池
    with  ThreadPoolExecutor(max_workers=3) as executor:
        # 提交 5 个任务给线程池执行
        futures = [executor.submit(task, i) for i in range(1, 6)]

        # 获取任务的结果
        for future in as_completed(futures):
            result = future.result()
            print(f'Result: {result}')

    end = time.time()
    print(f'Total time: {end - start:.3f} seconds')


if __name__ == '__main__':
    main()
